/********************************************************************** 
 * FILE		: DateUtilTools.java					
 *			
 * AUTHOR   : kloyf		
 * 
 * DATE		: 2011-6-2
 * 									
 * REASON	: CREATE  
 *            							
 * VERSION  ：1.0.0
 *
 ***********************************************************************/
package com.common.util.date;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 日期工具类
 * 
 * @author kloyf
 * @version 1.0.0
 * 
 */
public class DateUtilTools extends AbstractDateUtil {

	/**
	 * 功能描述：获取当前日期
	 * 
	 * @param format
	 *            String 日期格式
	 * @return String 返回例子：2001-01-01
	 */
	public static String getNowDate(String format) {
		return formatDate(new Date(), format);
	}

	/**
	 * 
	 * 解析字符串为日期类型，如果解析失败并且不抛出异常，那么返回为null； 如果抛出异常，那么抛出DateFormatException。
	 * 
	 * @param dateStr
	 *            需解析的日期字符串
	 * @param isThrowException
	 *            是否允许抛出异常
	 * @return <code>Date</code>
	 * 
	 * @throws DateFormatException
	 */

	public static Date parse(String dateStr, boolean isThrowException) {
		Date date = parseDate(dateStr, DateFormat.DATE_FORMAT_NUM1.getValue());
		if (date == null && isThrowException) {
			new DateFormatException("Date Format Error:" + dateStr);
		}
		return date;
	}

	/**
	 * 功能描述：获取当前日期和时间
	 * 
	 * @param format
	 *            String 日期格式
	 * @return String 返回例子：2001-01-01 01:01:01
	 */
	public static String getNowTime(String format) {
		return formatDate(new Date(), format);
	}

	/**
	 * 功能描述：获取当前年份
	 * 
	 * @param date
	 *            Date 时间
	 * @return int 返回年份
	 */
	public static int getYear(Date date) {
		Calendar calendar = getCalendar();
		calendar.setTime(date);
		return calendar.get(Calendar.YEAR);
	}

	/**
	 * 功能描述：获取当前月份
	 * 
	 * @param date
	 *            Date 时间
	 * @return int 返回月份
	 */
	public static int getMonth(Date date) {
		Calendar calendar = getCalendar();
		calendar.setTime(date);
		return calendar.get(Calendar.MONTH) + 1;
	}

	/**
	 * 功能描述：获取当前日期
	 * 
	 * @param date
	 *            Date 时间
	 * @return int 返回日期
	 */
	public static int getDay(Date date) {
		Calendar calendar = getCalendar();
		calendar.setTime(date);
		return calendar.get(Calendar.DAY_OF_MONTH);
	}

	/**
	 * 功能描述：返回小时
	 * 
	 * @param date
	 *            Date 日期
	 * @return int 返回小时
	 */
	public static int getHour(Date date) {
		Calendar calendar = getCalendar();
		calendar.setTime(date);
		return calendar.get(Calendar.HOUR_OF_DAY);
	}

	/**
	 * 功能描述：返回分钟
	 * 
	 * @param date
	 *            Date 日期
	 * @return int 返回分钟
	 */
	public static int getMinute(Date date) {
		Calendar calendar = getCalendar();
		calendar.setTime(date);
		return calendar.get(Calendar.MINUTE);
	}

	/**
	 * 功能描述：返回秒钟
	 * 
	 * @param date
	 *            Date 日期
	 * @return int 返回秒钟
	 */
	public static int getSecond(Date date) {
		Calendar calendar = getCalendar();
		calendar.setTime(date);
		return calendar.get(Calendar.SECOND);
	}

	/**
	 * 功能描述：获取当前周
	 * 
	 * @param date
	 *            Date 时间
	 * @return int 返回当前月份第几周
	 */
	public static int getWeekOfMonth(Date date) {
		Calendar calendar = getCalendar();
		calendar.setTime(date);
		return calendar.get(Calendar.WEEK_OF_MONTH);
	}

	/**
	 * 功能描述：获取从历元到现在所经过的毫秒数
	 * 
	 * @param date
	 *            Date 时间
	 * @return long 从历元到现在所经过的毫秒数
	 */
	public static long getDateTimeLong(Date date) {
		Calendar calendar = getCalendar();
		calendar.setTime(date);
		return calendar.getTimeInMillis();
	}

	/**
	 * 功能描述：获取时间为星期几
	 * 
	 * @param date
	 *            Date 时间
	 * @return String 返回结果：星期几
	 */
	public static String getWeek(Date date) {
		return formatDate(date, DateFormat.DATE_FROMAT_WEEK.getValue());
	}

	/**
	 * 功能描述：将日期字符串转换成日期对象
	 * 
	 * @param string
	 *            String 日期字符串
	 * @param format
	 *            String 日期格式。要将日期字符串转换成日期对象，需要根据日期字符串提供相应的日期格式.
	 * @return Date 日期对象。
	 */
	public static Date parseDate(String string, String format) {
		SimpleDateFormat sdf = getSimpleDateFormat(format);
		Date date = null;
		try {
			date = sdf.parse(string);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}

	/**
	 * 功能描述：计算两个日期相差的天数
	 * 
	 * @param date1
	 *            Date 日期1
	 * @param date2
	 *            Date 日期2
	 * @return int 返回结果：相差几天
	 */
	public static int dateCount(Date date1, Date date2) {
		long t1 = getDateTimeLong(date1);
		long t2 = getDateTimeLong(date2);
		return (int) ((t1 - t2) / Integer.parseInt(DateFormat.MILLIS_DAY.getValue()));
	}

	/**
	 * 功能描述：日期加天数
	 * 
	 * @param date
	 *            Date 日期
	 * @param day
	 *            int 天数
	 * @return Date 返回相加后的日期
	 */
	public static Date addDate(Date date, int day) {
		Calendar calendar = getCalendar();
		long millis = getDateTimeLong(date) + day * Integer.parseInt(DateFormat.MILLIS_DAY.getValue());
		calendar.setTimeInMillis(millis);
		return calendar.getTime();
	}

	/**
	 * 功能描述：日期减天数
	 * 
	 * @param date
	 *            Date Date 日期
	 * @param day
	 *            int 天数
	 * @return Date 返回相加后的日期
	 */
	public static Date minusDate(Date date, int day) {
		Calendar calendar = getCalendar();
		long millis = getDateTimeLong(date) - day * Integer.parseInt(DateFormat.MILLIS_DAY.getValue());
		calendar.setTimeInMillis(millis);
		return calendar.getTime();
	}

	/**
	 * 功能描述：取得指定月份的第一天
	 * 
	 * @param date
	 *            Date 日期
	 * @param format
	 *            String 日期格式
	 * @return String yyyy-MM-dd 格式
	 */
	public static String getMonthBegin(Date date, String format) {
		String dateString = formatDate(date, "yyyy-MM") + "-01";
		Date d = parseDate(dateString, DateFormat.DATE_FORMAT_NUM1.getValue());
		return formatDate(d, format);
	}

	/**
	 * 功能描述：取得指定月份的最后一天
	 * 
	 * @param date
	 *            Date 日期
	 * @param format
	 *            String 日期格式
	 * @return String 返回字符串型日期
	 */
	public static String getMonthEnd(Date date, String format) {
		Calendar calendar = getCalendar();
		calendar.setTime(parseDate(getMonthBegin(date, format), format));
		calendar.add(Calendar.MONTH, 1);
		calendar.add(Calendar.DAY_OF_YEAR, -1);
		return formatDate(calendar.getTime(), format);
	}
}
